/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package transervfx.Vista;

import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.image.ImageView;
import javafx.stage.Stage;
import javafx.util.Callback;
import javafx.util.Duration;
import transervfx.Dato.Entidad.Domicilio;
import transervfx.Dato.Entidad.Externa;
import transervfx.Dato.Entidad.Localidad;
import transervfx.Dato.Entidad.Pais;
import transervfx.Dato.Entidad.Provincia;
import transervfx.Logica.GestorAgencia;
import transervfx.Logica.GestorPais;
import transervfx.Vista.XML.pathRecusosFXML;
import utilidades.autocompletar.ComboBoxAutoCompletar;
import utilidades.dialog.OptionPane;
import utilidades.number.IntegerTextField;

/**
 * FXML Controller class
 *
 * @author oscar
 */
public class ABMAgenciaExterna extends VentanaModal {

    private Timeline locationUpdateTimeline;
    final static private int tiempoDeRespuesta = 200;
    @FXML
    private Button botonAceptar;
    @FXML
    private ImageView iconoBuscando;
    @FXML
    private TextField nombre;
    @FXML
    private TextField cuit;
    @FXML
    private ComboBox<String> condFIva;
    @FXML
    private TextField email;
    @FXML
    private TextField telefono1;
    @FXML
    private TextField celular1;
    @FXML
    private TextField calle;
    @FXML
    private TextField departamento;
    @FXML
    private IntegerTextField numero;
    @FXML
    private IntegerTextField piso;
    @FXML
    private TextField codigoPostal;
    @FXML
    private ComboBoxAutoCompletar<Localidad> localidad;
    @FXML
    private ComboBoxAutoCompletar<Provincia> provincia;
    @FXML
    private ComboBox<Pais> pais;
    @FXML
    private TableView<Externa> tablaAgencias;
    @FXML
    private TableColumn columnNombre;
    @FXML
    private TableColumn columnCuit;
    @FXML
    private TableColumn columnCondFIva;
    @FXML
    private TableColumn ColumnEmail;
    @FXML
    private TableColumn ColumnTelefono1;
    @FXML
    private TableColumn ColumnCelular1;
    @FXML
    private TableColumn columCalle;
    @FXML
    private TableColumn columNumero;
    @FXML
    private TableColumn columDepartamento;
    @FXML
    private TableColumn columPiso;
    @FXML
    private TableColumn columCodigoPostal;
    @FXML
    private TableColumn columLocalidad;
    @FXML
    private TableColumn columProvincia;
    private final ObservableList<Externa> dataSourceAgencias;
    
    private List<Externa> agenciasDisponibles=GestorAgencia.getInstance().findAllExterna();
    

    public ABMAgenciaExterna(Stage ventanaPadre, String titulo, int x, int y) {
        super(ventanaPadre, titulo, x, y);
        ObservableList<Externa> aux = FXCollections.observableArrayList(agenciasDisponibles);
        dataSourceAgencias= FXCollections.synchronizedObservableList(aux);
        init();
    }

    /*public ABMAgenciaExterna(Cliente cliente, Stage ventanaPadre, String titulo, int x, int y) {
        super(ventanaPadre, titulo, x, y);
      
        this.cliente=cliente;
        System.out.println("CANTIDAD DE LUGARES DE UN CLIETES EN EL NEW DE ABM: "+cliente.getLugaresPersonalesFrecuentes().size());
        ObservableList<LugarPersonalFrecuente> aux = FXCollections.observableArrayList(cliente.getLugaresPersonalesFrecuentes());
        dataSourceLugar= FXCollections.synchronizedObservableList(aux);
         
        
        if(ventanaPadre instanceof RegistrarEncomienda ) {
            this.botonAceptar.setText("Elegir");
        }  
        
        init();
      
    }*/
    
  
   

    public void init() {


        tablaAgencias.setItems(dataSourceAgencias);

        this.cargarPaicesProvinciasLocalidades();

        //introduce un Escuchador para cada Field del Filtro
        this.nombre.textProperty().addListener(this.escuchadorInputTextField);
        this.cuit.textProperty().addListener(this.escuchadorInputTextField);
        this.condFIva.valueProperty().addListener(this.escuchadorInputTextField);
        this.email.textProperty().addListener(this.escuchadorInputTextField);
        this.telefono1.textProperty().addListener(this.escuchadorInputTextField);
        this.celular1.textProperty().addListener(this.escuchadorInputTextField);
        
        this.calle.textProperty().addListener(this.escuchadorInputTextField);
        this.numero.textProperty().addListener(this.escuchadorInputTextField);
        this.departamento.textProperty().addListener(this.escuchadorInputTextField);
        this.piso.textProperty().addListener(this.escuchadorInputTextField);
        this.localidad.valueProperty().addListener(this.escuchadorInputTextField);
        this.provincia.valueProperty().addListener(this.escuchadorInputTextField);
        this.pais.valueProperty().addListener(this.escuchadorInputTextField);


        //Hace un binding entre La columna y las propiedades del usuarioViedw
          columnNombre.setCellValueFactory(
                new PropertyValueFactory<Externa, String>("nombre"));
        columnCuit.setCellValueFactory(
                new PropertyValueFactory<Externa, String>("cuit"));
        columnCondFIva.setCellValueFactory(
                new PropertyValueFactory<Externa, String>("condicionFrenteIVA"));
        this.ColumnEmail.setCellValueFactory(
                new PropertyValueFactory<Externa, String>("email"));
        ColumnTelefono1.setCellValueFactory(
                new PropertyValueFactory<Externa, String>("telFijo1"));
        ColumnCelular1.setCellValueFactory(
                new PropertyValueFactory<Externa, String>("telCelular1"));
          this.columCalle.setCellValueFactory(
                new Callback<CellDataFeatures<Externa, String>, ObservableValue<String>>() {
                    @Override
                    public ObservableValue<String> call(CellDataFeatures<Externa, String> p) {
                        // p.getValue() returns the Person instance for a particular TableView row
                        return new SimpleStringProperty(p.getValue().getDomicilio().getCalle());
                    }
                });
         this.columNumero.setCellValueFactory(
                new Callback<CellDataFeatures<Externa, String>, ObservableValue<String>>() {
                    @Override
                    public ObservableValue<String> call(CellDataFeatures<Externa, String> p) {
                        // p.getValue() returns the Person instance for a particular TableView row
                        return new SimpleStringProperty(p.getValue().getDomicilio().getNumero()+"");
                    }
                });
         this.columDepartamento.setCellValueFactory(
                new Callback<CellDataFeatures<Externa, String>, ObservableValue<String>>() {
                    @Override
                    public ObservableValue<String> call(CellDataFeatures<Externa, String> p) {
                        // p.getValue() returns the Person instance for a particular TableView row
                        return new SimpleStringProperty(p.getValue().getDomicilio().getDepartamento());
                    }
                });
         this.columPiso.setCellValueFactory(
                new Callback<CellDataFeatures<Externa, String>, ObservableValue<String>>() {
                    @Override
                    public ObservableValue<String> call(CellDataFeatures<Externa, String> p) {
                        // p.getValue() returns the Person instance for a particular TableView row
                        return new SimpleStringProperty(p.getValue().getDomicilio().getPiso()+"");
                    }
                });
        this.columLocalidad.setCellValueFactory(
                new Callback<CellDataFeatures<Externa, String>, ObservableValue<String>>() {
                    @Override
                    public ObservableValue<String> call(CellDataFeatures<Externa, String> p) {
                        // p.getValue() returns the Person instance for a particular TableView row
                        return new SimpleStringProperty(p.getValue().getDomicilio().getLocalidad().getNombre());
                    }
                });
        this.columProvincia.setCellValueFactory(
                new Callback<CellDataFeatures<Externa, String>, ObservableValue<String>>() {
                    @Override
                    public ObservableValue<String> call(CellDataFeatures<Externa, String> p) {
                        // p.getValue() returns the Person instance for a particular TableView row
                        return new SimpleStringProperty(p.getValue().getDomicilio().getLocalidad().getProvincia().getNombre());
                    }
                });
        //    System.out.println("texto "+this.nroDoc.getText()+"propertytext "+this.nroDoc.textProperty()+"propertynumber "+this.nroDoc.numberProperty()+" integer"+this.nroDoc.numberProperty().getValue());
    }

    private void buscarAgenciasPorFiltro() {
        List<Externa> agenciasFiltradas = new ArrayList();
        String nombre=this.nombre.getText().toUpperCase();
        String cuit=this.cuit.getText();
        String condicio=(this.condFIva.getSelectionModel().isEmpty()) ? "" : this.condFIva.getSelectionModel().getSelectedItem().toUpperCase();
        String email=this.email.getText().toUpperCase();
        String tel=this.telefono1.getText().toUpperCase();
        String cel=this.celular1.getText().toUpperCase();
        String calle = this.calle.getText().toUpperCase();
        String numero = this.numero.getText().toUpperCase();
        String departamento = this.departamento.getText().toUpperCase();
        String piso = this.piso.getText().toUpperCase();
        String localidad = (this.localidad.getSelectionModel().isEmpty()) ? "" : this.localidad.getSelectionModel().getSelectedItem().getNombre().toUpperCase();
        String provincia = (this.provincia.getSelectionModel().isEmpty()) ? "" : this.provincia.getSelectionModel().getSelectedItem().getNombre().toUpperCase();


        synchronized (dataSourceAgencias) {

            dataSourceAgencias.clear();
            for (Externa e : this.agenciasDisponibles) {

                if ((e.getNombre().toUpperCase().contains(nombre))
                        && (e.getCuit().contains(cuit))
                        && (e.getCondicionFrenteIVA().toUpperCase().contains(condicio))
                        && (e.getEmail().toUpperCase().contains(email))
                        && (e.getTelFijo1().toUpperCase().contains(cel))
                        && (e.getTelCelular1().toUpperCase().contains(cel))
                        && (e.getDomicilio().getCalle().toUpperCase().contains(calle))
                        && (e.getDomicilio().getNumero() + "").contains(numero) 
                        && (e.getDomicilio().getDepartamento()!=null & e.getDomicilio().getDepartamento().toUpperCase().contains(departamento) )
                        && (e.getDomicilio().getPiso()!=null & (e.getDomicilio().getPiso() + "").contains(piso))
                        && e.getDomicilio().getLocalidad().getNombre().toUpperCase().contains(localidad) & (e.getDomicilio().getLocalidad().getProvincia().getNombre().toUpperCase()).contains(provincia)) {
                    agenciasFiltradas.add(e);
                }
            }

            this.dataSourceAgencias.addAll(agenciasFiltradas);
        }
    }

    public void buttonCancelar(ActionEvent event) {
        //System.out.println(((Button)event.getSource()).getText());
        this.close();
        //System.exit(1);
    }

    public void buttonNuevo() throws NoSuchMethodException, IOException {
        new CrearAgenciaExterna(this, "crear Agencia externa", 800, 700);
    }
    
    ChangeListener escuchadorInputTextField = new ChangeListener<Object>() {
        public void changed(
                ObservableValue observableValue,
                Object s, Object s1) {

            if(s1!=null){
            if (!s1.toString().isEmpty() || !s.toString().equals(s1)) {
                // delay location updates to we don't go too fast file typing

                iconoBuscando.setVisible(true);

                if (locationUpdateTimeline != null) {

                    locationUpdateTimeline.stop();
                }

                locationUpdateTimeline = new Timeline();
                locationUpdateTimeline.getKeyFrames().add(
                        new KeyFrame(new Duration(tiempoDeRespuesta),
                        new EventHandler<ActionEvent>() {
                            public void handle(ActionEvent actionEvent) {

                                buscarAgenciasPorFiltro();
                                iconoBuscando.setVisible(false);
                            }
                        }));
                locationUpdateTimeline.play();

            }
        }}
    };

    private void cargarPaicesProvinciasLocalidades() {


        pais.setItems(FXCollections.observableArrayList(GestorPais.getInstance().paises()));


        provincia.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Provincia>() {
            @Override
            public void changed(ObservableValue<? extends Provincia> arg0, Provincia arg1, Provincia arg2) {
                if (arg2 != null) {
                    localidad.setData(GestorPais.getInstance().localidades(arg2));
                }
            }
        });


        pais.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Pais>() {
            @Override
            public void changed(ObservableValue<? extends Pais> arg0, Pais arg1, Pais arg2) {
                if (arg2 != null) {
                    provincia.setData(GestorPais.getInstance().provincias(arg2));
                }
            }
        });




    }

    @Override
    URL getURLFXML() {
        return pathRecusosFXML.class.getResource("ABMAgenciaExternaFXML.fxml");
    }

   

    public void actualizarTabla(Externa externaNew) {
        
        synchronized (this.dataSourceAgencias) {       
        this.dataSourceAgencias.add(externaNew);
        this.agenciasDisponibles.add(externaNew);
        }  
    }
}
